﻿#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>

//Teacher 类
//Student 类
//下课后老师会触发一个信号，饿了，学生响应信号，请客吃饭

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师对象
    this->zt = new Teacher(this);


    //创建一个学生对象
    this->st = new Student(this);

//    //老师饿了，学生请客的连接
//    connect(zt,&Teacher::hungry,st,&Student::treat);

//    //调用下课函数
//    classIsOver();

    //连接带参数的 信号和槽
    //指针->地址
    //函数指针->函数地址
    void(Teacher:: *teacherSignal)(QString)= &Teacher::hungry;
    void(Student:: *studentSlot)(QString)= &Student::treat;
    connect(zt,teacherSignal,st,studentSlot);
    //classIsOver();

    //点击一个 下课的按钮，再触发下课
    QPushButton * btn = new QPushButton(QStringLiteral("下课"),this);
    //重置窗口大小
    this->resize(600,400);
    //点击按钮 触发下课
    //connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

    //无参信号和槽连接
    void(Teacher:: *teacherSignal2)(void)= &Teacher::hungry;
    void(Student:: *studentSlot2)(void)= &Student::treat;
    connect(zt,teacherSignal2,st,studentSlot2);
    //信号连接信号
    connect(btn,&QPushButton::clicked,zt,teacherSignal2);

    //断开信号
    disconnect(zt,teacherSignal2,st,studentSlot2);

    //拓展
    //信号可以连接信号
    //一个信号可以连接多个槽函数
    //多个信号可以连接同一个槽函数
    //信号和槽函数的参数必须类型一一对应
    //信号的参数个数可以多于槽的参数个数

    //lambda 表达式
    [=]()
    {
        btn->setText("aaa");
    }();

    //mutable 用于修饰值传递的变量，修改的是拷贝，不是值本身
    QPushButton *myBtn = new QPushButton(this);
    QPushButton *myBtn2 = new QPushButton(this);
    myBtn->move(0,30);
    myBtn2->move(0,60);
    int m = 10;
    connect(myBtn,&QPushButton::clicked,this,[m] ()mutable {m = 100 + 10 ;qDebug()<<m;});
    connect(myBtn2,&QPushButton::clicked,this,[=] ()mutable {qDebug()<<m;});
    qDebug()<<m;

    int ret = [] ()->int {return 1000;}();
    qDebug() << "ret=" <<ret;

    //利用lambda表达式实现点击按钮关闭窗口
    QPushButton *btn3 = new QPushButton;
    btn3->setText(QStringLiteral("关闭"));
    btn3->move(0,90);
    btn3->setParent(this);
    connect(btn3,&QPushButton::clicked,this, [=] ()
    {
       this->close();
    });
}

void Widget::classIsOver()
{
    //下课函数，调用后触发老师饿了的新号

   //emit zt->hungry();
    emit zt->hungry(QStringLiteral("宫保鸡丁"));
}

Widget::~Widget()
{
    delete ui;
}
